package com.cskaoyan.javase.oop3.innerclazz6.local4.notice2;

/**
 * @description: 局部内部类注意事项
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * - Java8之前的版本中，局部内部类只能访问方法中加了final的局部变量
 * 原因：
 * 主要原因在于：局部内部类对象的生命周期和方法的局部变量的生命周期，不重合
 * 局部内部类对象完全有可能比方法的局部变量活得更久
 * 这样就导致方法的局部变量消失了，但是对象里仍然在用这个局部变量，这样显然不合理
 * 所以这里jvm帮助我们做了一步，操作：它偷偷的把这份方法的局部变量存了一个副本到内部类对象中
 * 所以即便是方法的局部变量销毁了 仍然可以使用这个局部变量 因为用的是一个副本
 *
 * 局部内部类最大的优势是对方法外部完全隐藏，除了方法本身，即便是当前类也不知道它，不能访问它
 *
 * - 这是一种极致的封装思想的体现
 *
 *
 */
public class Demo {
}
class EnclosedClazz{

    public void test(){
       final int a = 10; //方法中的局部变量

        class InnerLocalClazz{ //局部内部类
            public void test(){
                System.out.println(a);
                //Variable 'a' is accessed from within inner class, needs to be final or effectively final
                //内部类方法方法的局部变量的时候，需要用final修饰这个方法的局部变量或者实际上的final
                //实际上的final：虽然没有用final修饰，但是你不改
                //a = 12;
            }
        }
    }

}
